﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Win10_1607版本号计算器
{
    public partial class classics : Form
    {
        private bool clear;//当点击等号后，经过了计算则为TRUE，为下一次的输入时直接清空当前的答案
        private char[] symbols;
        //构造器
        public classics()
        {
            InitializeComponent();
            symbols = new char[5] { '+', '%', '*', '/', '-' };
            clear = false;
        }

        //创建一个方法，当显示屏中出现运算符号时换行
        public void rn()
        {
            //首先要将负号除去，避免和减号混淆
            if (this.textBox1.Text[0] == '-')
            {
                string text = this.textBox1.Text.Substring(1);
                foreach(char symbol in symbols)
                {
                    if (text.Contains(symbol))//含有符号删除
                    {
                        this.textBox1.AppendText("\r\n");
                        MessageBox.Show("有负号");
                    }
                }
            }
            else//无负号处理
            {
                foreach (char symbol in symbols)
                {
                    if (textBox1.Text.Contains(symbol))//含有符号删除
                    {
                        this.textBox1.AppendText("\r\n");
                        MessageBox.Show("无负号");
                    }
                }
            }
            
        }

        //创建一个方法来简化数字按钮点击事件
        public void addNum(int num)
        {
            this.textBox1.Text = this.textBox1.Text + num.ToString();
        }

        //若开始为一个0，删除0
        public void Start()
        {
            if (this.textBox1.Text=="0")//若为0，删除0
            {
                this.textBox1.Text = "";
            }
         
        }

        //显示屏最大长度为12
        public bool fall()
        {
            if (this.textBox1.Text.Length < 12)
            {
                return true;
            }
            else
            {
                return false;
            }
        }


        /**
         *  符号互斥，不允许有两个符号同时出现
         *  处理原则当显示屏中有一个运算符和两个数字时，即做出运算
         *  
         * */
        public bool symbolMutual()
        {
            if (this.textBox1.Text[0] == '-')//开头含有负号（减号）
            {
                string text = this.textBox1.Text.Substring(1);//去除负号
                foreach (char symbol in symbols)
                {
                    if (text.Contains(symbol))
                    {
                        return true;//存在符号冲突，不能在显示屏输出符号
                    }
                }
            }
            else//无负号直接查看是否有减号
            {
                foreach (char symbol in symbols)
                {
                    if (this.textBox1.Text.Contains(symbol))
                    {
                        return true;//存在符号冲突，不能在显示屏输出符号
                    }
                }
            }
            return false;
        }


        private void button14_Click(object sender, EventArgs e)
        {
            //9
            if (clear == false)//当前显示屏不是上一次的计算成果时
            {
                if (fall())//长度小于12时
                {
                    Start();
                    addNum(9);
                    // this.rn();
                }
            }
            else//是上一次的计算成果时，清除然后直接添加不需要考虑初始的0
            {
                this.textBox1.Text = "";
                addNum(9);
                clear = false;//改回原状态
            }



        }

        private void button13_Click(object sender, EventArgs e)
        {
            // /
            //除法
            if (textBox1.Text != "0"&& !this.symbolMutual())
            {
                this.textBox1.Text += "/";
            }
            
        }

        private void WinStart_Load(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
           
        }

        private void button10_Click(object sender, EventArgs e)
        {
            //左箭頭,删除一个数字
            if (this.textBox1.Text != "0")//不为0，就删除一个数字
            {
                this.textBox1.Text = this.textBox1.Text.Remove(this.textBox1.Text.Length-1,1);
                if (this.textBox1.Text.Length==0)//当你删完最后一个数字时,填充上0
                {
                    this.textBox1.Text = "0";
                }
            }
            
        }

        private void button12_Click(object sender, EventArgs e)
        {
            //7
            if (clear == false)//当前显示屏不是上一次的计算成果时
            {
                if (fall())//长度小于12时
                {
                    Start();
                    addNum(7);
                    // this.rn();
                }
            }
            else//是上一次的计算成果时，清除然后直接添加不需要考虑初始的0
            {
                this.textBox1.Text = "";
                addNum(7);
                clear = false;//改回原状态
            }
        }

        private void button11_Click(object sender, EventArgs e)
        {
            //8
            if (clear == false)//当前显示屏不是上一次的计算成果时
            {
                if (fall())//长度小于12时
                {
                    Start();
                    addNum(8);
                    // this.rn();
                }
            }
            else//是上一次的计算成果时，清除然后直接添加不需要考虑初始的0
            {
                this.textBox1.Text = "";
                addNum(8);
                clear = false;//改回原状态
            }

        }

        private void button15_Click(object sender, EventArgs e)
        {
            //4
            if (clear == false)//当前显示屏不是上一次的计算成果时
            {
                if (fall())//长度小于12时
                {
                    Start();
                    addNum(4);
                    // this.rn();
                }
            }
            else//是上一次的计算成果时，清除然后直接添加不需要考虑初始的0
            {
                this.textBox1.Text = "";
                addNum(4);
                clear = false;//改回原状态
            }

        }

        private void button18_Click(object sender, EventArgs e)
        {
            //5
            if (clear == false)//当前显示屏不是上一次的计算成果时
            {
                if (fall())//长度小于12时
                {
                    Start();
                    addNum(5);
                    // this.rn();
                }
            }
            else//是上一次的计算成果时，清除然后直接添加不需要考虑初始的0
            {
                this.textBox1.Text = "";
                addNum(5);
                clear = false;//改回原状态
            }

        }

        private void button17_Click(object sender, EventArgs e)
        {
            //6
            if (clear == false)//当前显示屏不是上一次的计算成果时
            {
                if (fall())//长度小于12时
                {
                    Start();
                    addNum(6);
                    // this.rn();
                }
            }
            else//是上一次的计算成果时，清除然后直接添加不需要考虑初始的0
            {
                this.textBox1.Text = "";
                addNum(6);
                clear = false;//改回原状态
            }
        }

        private void button23_Click(object sender, EventArgs e)
        {
            //1
            if (clear == false)//当前显示屏不是上一次的计算成果时
            {
                if (fall())//长度小于12时
                {
                    Start();
                    addNum(1);
                    // this.rn();
                }
            }
            else//是上一次的计算成果时，清除然后直接添加不需要考虑初始的0
            {
                this.textBox1.Text = "";
                addNum(1);
                clear = false;//改回原状态
            }

        }

        private void button22_Click(object sender, EventArgs e)
        {
            //2
            if (clear == false)//当前显示屏不是上一次的计算成果时
            {
                if (fall())//长度小于12时
                {
                    Start();
                    addNum(2);
                    // this.rn();
                }
            }
            else//是上一次的计算成果时，清除然后直接添加不需要考虑初始的0
            {
                this.textBox1.Text = "";
                addNum(2);
                clear = false;//改回原状态
            }
        }

        private void button21_Click(object sender, EventArgs e)
        {
            //3
            if (clear == false)//当前显示屏不是上一次的计算成果时
            {
                if (fall())//长度小于12时
                {
                    Start();
                    addNum(3);
                    // this.rn();
                }
            }
            else//是上一次的计算成果时，清除然后直接添加不需要考虑初始的0
            {
                this.textBox1.Text = "";
                addNum(3);
                clear = false;//改回原状态
            }
        }

        private void button27_Click(object sender, EventArgs e)
        {
            //0
            if (clear == false)//当前显示屏不是上一次的计算成果时
            {
                if (fall())//长度小于12时
                {
                    Start();
                    addNum(0);
                    // this.rn();
                }
            }
            else//是上一次的计算成果时，清除然后直接添加不需要考虑初始的0
            {
                this.textBox1.Text = "";
                addNum(0);
                clear = false;//改回原状态
            }
        }

        private void button29_Click(object sender, EventArgs e)
        {
            //.
            /**
             * 添加小数点
             * 由于规定显示屏中只会出现一个运算符就会进行计算，那么，只要判定有数字并且，前面没有小数点即可或者前面有运算符有数字那么还可以在带一个小数点
             * */
          
            foreach (char symbol in symbols)
            {
                if (!this.textBox1.Text.Contains(symbol)&& !this.textBox1.Text.Contains("."))//不含有运算符并且不含有小数点，说明是第一个数字没有带小数点，可以带
                {
                    this.textBox1.Text += ".";//可以添加小数点

                }
                else if(this.textBox1.Text.Contains(symbol))//含有运算符，说明现在处理第二个数字，那么必须保证1第二个数字没有小数点
                {
                    string num2 = this.textBox1.Text.Split(symbol)[1];
                    if(!num2.Contains("."))
                    {
                        this.textBox1.Text += ".";//可以添加小数点
                    }
                }
            }
        }
        private void button28_Click(object sender, EventArgs e)
        {
            //+
            //加法
            if (textBox1.Text != "0" && !this.symbolMutual())
            {
                this.textBox1.Text += "+";
            }
        }

        private void button25_Click(object sender, EventArgs e)
        {
            //-
            //减法
            if (textBox1.Text != "0" && !this.symbolMutual())
            {
                this.textBox1.Text += "-";
            }
        }

        private void button19_Click(object sender, EventArgs e)
        {
            //*
            //乘法
            if (textBox1.Text != "0" && !this.symbolMutual())
            {
                this.textBox1.Text += "*";
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            if (this.clear != true)//当刚刚计算得到一个值的时候不提供一个值
            {
                if (this.textBox1.Text != "0")//0既不是正数也不是负数，所以非0才能设置正负
                {
                    //设置正负
                    if (this.textBox1.Text[0] == '-')//开头为-
                    {
                        this.textBox1.Text = this.textBox1.Text.Remove(0, 1);//移除-，变成+的
                    }
                    else//不是变成负的
                    {
                        this.textBox1.Text = this.textBox1.Text.Insert(0, "-");
                    }
                }
            } 
        }

        private void button7_Click(object sender, EventArgs e)
        {
            //genhao
            if( !this.symbolMutual())//只有没有符号时才能开方
            {
                double num = double.Parse(this.textBox1.Text);
                if (num > 0)//负数没有开方
                {
                    num = Math.Sqrt(num);//sqrt方法开方
                    this.textBox1.Text = num.ToString("0.00000");//保留小数点后五位小数
                }
            }
        }

        private void button16_Click(object sender, EventArgs e)
        {
            //yushu
            //余数
            if (this.textBox1.Text != "0" && !this.symbolMutual())
            {
                this.textBox1.Text += "%";
            }
        }

        private void button20_Click(object sender, EventArgs e)
        { 
            // fenshu
            //取倒数
            bool containsSymbol = false;
            if (this.textBox1.Text[0] != '-')//不是负数时
            {
                foreach (char symbol in symbols)
                {
                    if (this.textBox1.Text.Contains(symbol))//判断是否有符号,有符号，不能转化
                    {
                        containsSymbol = true;
                    }
                }
                if (!containsSymbol)//不含符号才能转化
                {
                    double num = double.Parse(this.textBox1.Text.ToString());
                    this.textBox1.Text = (1 / num).ToString("0.0000");
                }
            }
            else
            {
                string num = this.textBox1.Text.Substring(1);
                foreach (char symbol in symbols)
                {
                    if (num.Contains(symbol))//判断是否有符号,有符号，不能转化
                    {
                        containsSymbol = true;
                    }
                }
                if (!containsSymbol)//不含符号才能转化
                {
                    double num1 = double.Parse(num.ToString());
                    this.textBox1.Text ="-"+ (1 / num1).ToString("0.0000");
                }
            }    

        }

        private void button24_Click(object sender, EventArgs e)
        {
            //等号    symbols = new char[5] { '+', '%', '*', '/', '-' };
            
            if (this.textBox1.Text.Contains('+')&&clear==false)//含有+号并且状态必须是没有计算过的
            {
                if (this.textBox1.Text[this.textBox1.Text.Length-1] !='+')//防止计算表达式不完全的情况比如：9+
                {
                    decimal num1 = decimal.Parse(this.textBox1.Text.Split('+')[0]);
                    decimal num2 = decimal.Parse(this.textBox1.Text.Split('+')[1]);
                    this.textBox1.AppendText("\r\n");
                    this.textBox1.Text += (num1 + num2).ToString("0.00000000");
                    clear = true;//下一次在输入数字时所有的答案必须清除
                }
            }
            if (this.textBox1.Text.Contains('%') && clear == false)
            {
                if (this.textBox1.Text[this.textBox1.Text.Length - 1] != '%')
                {
                    decimal num1 = decimal.Parse(this.textBox1.Text.Split('%')[0]);
                    decimal num2 = decimal.Parse(this.textBox1.Text.Split('%')[1]);
                    this.textBox1.AppendText("\r\n");
                    this.textBox1.Text += (num1 % num2).ToString("0.00000000");
                    clear = true;//下一次在输入数字时所有的答案必须清除
                }
            }
            if (this.textBox1.Text.Contains('*') && clear == false)
            {
                if (this.textBox1.Text[this.textBox1.Text.Length - 1] != '*')
                {
                    decimal num1 = decimal.Parse(this.textBox1.Text.Split('*')[0]);
                    decimal num2 = decimal.Parse(this.textBox1.Text.Split('*')[1]);
                    this.textBox1.AppendText("\r\n");
                    this.textBox1.Text += (num1 * num2).ToString("0.00000000");
                    clear = true;//下一次在输入数字时所有的答案必须清除
                }
            }
            if (this.textBox1.Text.Contains('/') && clear == false)
            {
                if (this.textBox1.Text[this.textBox1.Text.Length - 1] != '/')
                {
                    decimal num1 = decimal.Parse(this.textBox1.Text.Split('/')[0]);
                    decimal num2 = decimal.Parse(this.textBox1.Text.Split('/')[1]);
                    this.textBox1.AppendText("\r\n");
                    this.textBox1.Text += (num1 / num2).ToString("0.00000000");
                    clear = true;//下一次在输入数字时所有的答案必须清除
                }
              
            }
            if (this.textBox1.Text.Contains('-') && clear == false)
            {
                if (this.textBox1.Text[this.textBox1.Text.Length - 1] != '-')
                {
                    decimal num1 = decimal.Parse(this.textBox1.Text.Split('-')[0]);
                    decimal num2 = decimal.Parse(this.textBox1.Text.Split('-')[1]);
                    this.textBox1.AppendText("\r\n");
                    this.textBox1.Text += (num1 - num2).ToString("0.00000000");
                    clear = true;//下一次在输入数字时所有的答案必须清除
                }
            }
           
        }

        private void button8_Click(object sender, EventArgs e)
        {
            //清除
            this.textBox1.Text = "0";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("将错误发送到程嘉明的邮箱：2239539295@qq.com");
        } 
    }
}
